package com.sgzn.sgpay.util.httpClient;

import com.sgzn.sgpay.util.GenerateSignUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

/**
 * @author huangsenguang
 */
@Slf4j
public class HttpXMLUtil {
    /**
     * 调用再次签名
     * @param prepay_id 预支付交易会话标识
     * @param mchKey 秘钥
     * @param appId 小程序ID
     * @return
     */
    public static Map<String, String> generateSignature(String prepay_id, String mchKey, String appId, String nonceStr, String payOrderId) {
        log.info("微信 支付接口生成签名 方法开始");
        //获得参数(微信统一下单接口生成的prepay_id )
        //创建 时间戳
        String timeStamp = Long.valueOf(System.currentTimeMillis()).toString();
        //创建 随机串
        //创建 MD5
        String signType = "MD5";

        //创建hashmap(用户获得签名)
        SortedMap<String, String> fiveParamMap = new TreeMap<String, String>();
        //设置(小程序ID)(这块一定要是大写)
        fiveParamMap.put("appId", appId);
        //设置(时间戳)
        fiveParamMap.put("timeStamp", timeStamp);
        //设置(随机串)
        fiveParamMap.put("nonceStr", nonceStr);
        //设置(数据包)
        fiveParamMap.put("package", "prepay_id=" + prepay_id);
        //设置(签名方式)
        fiveParamMap.put("signType", signType);

        //调用逻辑传入参数按照字段名的 ASCII 码从小到大排序（字典序）
        String sign = GenerateSignUtils.generateSign(fiveParamMap, mchKey);

        if (StringUtils.isNotBlank(sign)) {
            //返回签名信息
            fiveParamMap.put("paySign", sign);
            log.info("微信 支付接口生成签名 设置返回值[{}]",sign);
        }
        //订单号
        fiveParamMap.put("payOrderId",payOrderId);
        log.info("微信 支付接口生成签名:[{}]  方法结束",fiveParamMap.toString());
        return fiveParamMap;
    }

    /**
     * 方法名: getRemotePortData
     * 描述: 发送远程请求
     * 参数：  @param urls 访问路径
     * 参数：  @param param 访问参数-字符串拼接格式, 例：port_d=10002&port_g=10007&country_a=
     * 创建时间: 2017年3月6日 下午3:20:32
     * 版本号: v1.0
     * 返回类型: String
     */
    public static String getRemotePortData(String urls, String param){
        log.info("开始发送:[{}] ; PARAM:[{}]", urls,param);
        try {
            URL url = new URL(urls);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 设置连接超时时间
            conn.setConnectTimeout(30000);
            // 设置读取超时时间
            conn.setReadTimeout(30000);
            conn.setRequestMethod("POST");
            if(StringUtils.isNotBlank(param)) {
                conn.setRequestProperty("Origin", "https://sirius.searates.com");// 主要参数
                conn.setRequestProperty("Referer", "https://sirius.searates.com/cn/port?A=ChIJP1j2OhRahjURNsllbOuKc3Y&D=567&G=16959&shipment=1&container=20st&weight=1&product=0&request=&weightcargo=1&");
                conn.setRequestProperty("X-Requested-With", "XMLHttpRequest");// 主要参数
            }
            // 需要输出
            conn.setDoInput(true);
            // 需要输入
            conn.setDoOutput(true);
            // 设置是否使用缓存
            conn.setUseCaches(false);
            // 设置请求属性
            conn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接
            conn.setRequestProperty("Charset", "UTF-8");

            if(StringUtils.isNotBlank(param)) {
                OutputStream outputStream = conn.getOutputStream();
                outputStream.write(param.getBytes("UTF-8"));
                outputStream.close();
            }
            // 输出返回结果
            InputStream input = conn.getInputStream();
            int resLen =0;
            byte[] res = new byte[1024];
            StringBuilder sb=new StringBuilder();
            while((resLen=input.read(res))!=-1){
                sb.append(new String(res, 0, resLen));
            }
            return sb.toString();
        } catch (MalformedURLException e) {
            e.printStackTrace();
            log.error("Http请求发生异常：", e);
        } catch (IOException e) {
            e.printStackTrace();
            log.error("Http请求发生异常：", e);
        }
        log.error("[{}]失败, 返回空字符串");
        return "";
    }
}

